// 组合继承结合了原型链和盗用构造函数继承，将两者的优点集中了起来。基本的思路是使用原型链继承原型上的属性和方法，而通过盗用构造函数继承实例属性。这样既可以把方法定义在原型上以实现重用，又可以让每个实例都有自己的属性。
// 1、优点是可以实现函数复用，保证每个实例之间的属性不会相互影响。

// 2、缺点是超类型属性继承两次，一次是子类型原型继承，一次是子类型实例继承，但实例继承的属性屏蔽了原型继承的属性。
function Animal (name) { // 父类构造函数
  this.name = name
  this.colors = ['red', 'blue']
}
Animal.prototype.getColor = function () { // 父类原型链属性
  console.log(this);
  return this.colors
}
function Dog (name, age) {
  Animal.call(this, name) // 借用构造函数
  this.age = age
}
Dog.prototype = new Animal() // 原型链继承
Dog.prototype.constructor = Dog
let dog1 = new Dog('小王', 20)
let dog2 = new Dog('嚣张', 23)
dog1.colors.push('green')
console.log((dog2.getColor()));  // 对其他的不会产生影响 就是